﻿using System;
using TY.UC.Common;
using TY.UC.Common.Extension;
using TY.UT.Pay.WxPay.lib;

namespace TY.UT.Pay.WxPay
{
    /// <summary>
    /// 子商户服务
    /// </summary>
    public class SubMerJsApiPayHelper
    {
        /// <summary>
        /// 调用统一下单，获得下单结果(H5支付)
        /// 子商户下单
        /// 失败时抛异常WxPayException
        /// </summary>
        /// <returns>统一下单结果</returns>
        public static string GetUnifiedOrderResult(string body, string outTradeNo, float totalFee,
            string openid,string sub_appid,string sub_mch_id,string sub_openid)
        {
            WxPayData data = new WxPayData();
            data.SetValue("body", body); //商品简单描述，该字段须严格按照规范传递，具体请见参数规定
            data.SetValue("attach", "test"); //附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
            data.SetValue("out_trade_no", outTradeNo); //商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
            data.SetValue("total_fee", Convert.ToInt32(totalFee * 100)); //订单总金额，单位为分，详见支付金额
            data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //订单生成时间，格式为yyyyMMddHHmmss，
            data.SetValue("time_expire", DateTime.Now.AddMinutes("order_timeout".GetIntValue() == 0 ? 10 : "order_timeout".GetIntValue()).ToString("yyyyMMddHHmmss"));
            //订单失效时间，格式为yyyyMMddHHmmss 注意：最短失效时间间隔必须大于5分钟
            data.SetValue("goods_tag", "test"); //商品标记，代金券或立减优惠功能的参数，说明详见代金券或立减优惠
            data.SetValue("trade_type", "JSAPI"); //取值如下：JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付，详细说明见参数规定
            data.SetValue("openid", openid); //用户在商户appid下的唯一标识
            data.SetValue("sub_openid", sub_openid); //用户在商户appid下的唯一标识
            data.SetValue("sub_appid", sub_appid);//子商户appid
            data.SetValue("sub_mch_id", sub_mch_id);//子商户号

            WxPayData result = WxPayApi.SubUnifiedOrder(data, 12); //默认12秒，减少微信请求超时
            
            if (result.IsSet("sub_appid") && result.IsSet("appid") && result.IsSet("prepay_id") && result.GetValue("prepay_id").ToString() != "")
            {
                WxPayData jsApiParam = new WxPayData();
                jsApiParam.SetValue("appId", result.GetValue("sub_appid")); //子商户appid
                jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); //生成时间戳
                jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); // 生成随机串，随机串包含字母或数字
                jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id")); //
                jsApiParam.SetValue("signType", "MD5");
                jsApiParam.SetValue("paySign", jsApiParam.MakeSign());
                jsApiParam.SetValue("total_fee", totalFee); //订单总金额，单位为分，详见支付金额
                jsApiParam.SetValue("out_trade_no", outTradeNo);
                string parameters = jsApiParam.ToJson();

                Log.Debug("JsApiPayHelper-GetUnifiedOrderResult", "Get jsApiParam : " + parameters);
                return parameters;
            }
            Log.Error("JsApiPayHelper-GetUnifiedOrderResult", "UnifiedOrder response error!");
            return null;
        }
        
    } 
}
